#ifndef _TABLASIMBOLOS_H
#define _TABLASIMBOLOS_H

#include <stdlib.h>
#include <string.h>
#include <stdio.h>


/* Estructura que representsa los atributos que puede llegar a tener cualquier TOKEN  */
struct atributos_simbolos
{
	int ID_funcion;
	int ID_contexto;	/* 1: clase, 2: variable static , 3: variable field , 4: variable var , 5: constructor, 6: method, 7: function, 8: paramtro funcion */	
	int tipo;			/* 0:No Aplica, 1: entero, 2: caracter, 3: void, 4: Boolean, 5: tipo clase */
	int direccion;
};

/* Estructura que representa un registro dentro de la tabla de simbolos */
struct registro
{
	char *id;
	struct atributos_simbolos *atributos;
	struct registro *prev, *sgte;
};

/* Estructura que representa una lista de variables */
struct lista_variables
{
  	struct registro *variables;
  	struct lista_variables *sgte;
};



struct lista_parametros
{
	struct registro *parametros;
	struct lista_parametros *sgte;
};

/* Esta estructura representa la tabla de simbolos */  
extern struct registro *ST;

/* Esta estructura represena la lista de variables donde se almacena los tipos */
extern struct lista_variables *lista_var;

/* Esta funcion ingresa un simbolo dentro de la tabla de simbolo */ 
extern struct registro *put_symbol(char *);

/* Esta funcion obtiene un simbolo de la tabla de simbolos */
extern struct registro *get_symbol(char *);

/* Esta funcion imprime la tabla de simbolos */
extern void print_ST(struct registro *);

/* Esta funcion añade el contexto a un simbolo en la tabla de simbolos */
extern struct registro *add_context(struct registro *,int);

/* Esta funcion se encarga de añadir el tipo a cada simbolo de la tabla de simbolos */
extern struct registro *add_tipo(struct registro *, int);

/* Esta funcion obtiene el tipo de un simbolo dentro de la tabla de simbolos*/
extern int get_tipo(struct registro *);


extern struct registro *add_function_id(struct registro *, int);


extern int get_function_id(struct registro *);


/* Esta funcion elimina un simbolo dentro de la tabla se simbolos */
extern void del_symbol(struct registro*);	

#endif
